home *** CD-ROM | disk | FTP | other *** search
- //$Id: RgbHsv.cpp 1.1 1996/07/18 23:58:15 Damien Exp $
-
- // Copyright (c) 1990-1995 Ray Dream, Inc. All rights reserved.
-
-
- #ifndef __RGBHSV__
- #include "rgbhsv.h"
- #endif
-
- #include <math.h>
-
-
- void RDHSV2RGB(const RDHSVColor& hsvColor, RDRGBColor& rgbColor) {
- double r=0;
- double g=0;
- double b=0;
-
- double h = (double)hsvColor.hue/65535.0 ; //angle in degree
- double s = (double)hsvColor.saturation/65535.0;
- double v = (double)hsvColor.value/65535.0;
-
- if (s != 0) {
- h *= 6;
- short sextant =(short) floor(h);
- double fract = h - sextant;
- double min = v*(1-s);
- double vsf = v*s*fract;
- double mid1 = min + vsf;
- double mid2 = v - vsf;
- switch (sextant) {
- case 0: {
- r = v;
- g = mid1;
- b = min;
- break;
- }
- case 1: {
- r = mid2;
- g = v;
- b = min;
- break;
- }
- case 2: {
- r = min;
- g = v;
- b = mid1;
- break;
- }
- case 3: {
- r = min;
- g = mid2;
- b = v;
- break;
- }
- case 4: {
- r = mid1;
- g = min;
- b = v;
- break;
- }
- case 5: {
- r = v;
- g = min;
- b = mid2;
- break;
- }
- } // switch
- }
- else {
- r = v;
- g = v;
- b = v;
- }
-
-
- rgbColor.rr = (unsigned short) (r * 65535);
- rgbColor.gg = (unsigned short) (g * 65535);
- rgbColor.bb = (unsigned short) (b * 65535);
- }
-
- void RDRGB2HSV(const RDRGBColor& rgbColor, RDHSVColor& hsvColor) {
- double r= (double)rgbColor.rr / 65535.0;
- double g= (double)rgbColor.gg / 65535.0;
- double b= (double)rgbColor.bb / 65535.0;
- double max,min,delta;
- double h = 0;
- double s = 0;
- double v = 0;
-
- if (r>g) //compute max and min simultaneously
- if (g>b) {
- max = r;
- min = b;
- }
- else {
- min = g;
- if (r>b)
- max = r;
- else
- max = b;
- }
- else
- if (r>b) {
- max = g;
- min = b;
- }
- else {
- min = r;
- if (g>b)
- max = g;
- else
- max = b;
- }
-
- delta = max-min;
-
- v = max;
- if (v != 0.0) {
- s = delta/max;
- if (s != 0.0) {
- if (max==r)
- h = (g-b)/delta;
- else if (max==g)
- h = 2.0 + (b - r)/delta;
- else
- h = 4.0 + (r -g)/delta ;
- h /= 6;
- if (h<0)
- h += 1.0; // make sure hue > 0
- }
- }
-
- hsvColor.hue = (unsigned short) (h * 65535);
- hsvColor.saturation = (unsigned short) (s * 65535);
- hsvColor.value = (unsigned short) (v * 65535);
- }
-